package com.patryklenza.androidespressoidlingresource;
import android.app.Activity;
import android.app.Instrumentation;
import android.content.Intent;
import android.support.test.InstrumentationRegistry;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
// Jake Wharton's ActivityRule -> https://gist.github.com/JakeWharton/1c2f2cadab2ddd97f9fb
public class ActivityRule<T extends Activity> implements TestRule {
private final Class<T> activityClass;
private T activity;
private Instrumentation instrumentation;
public ActivityRule(Class<T> activityClass) {
this.activityClass = activityClass;
}
protected Intent getLaunchIntent(String targetPackage, Class<T> activityClass) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClassName(targetPackage, activityClass.getName());
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
return intent;
}
/**
* Get the running instance of the specified activity. This will launch it if it is not already
* running.
*/
public final T get() {
launchActivity();
return activity;
}
/**
* Get the {@link Instrumentation} instance for this test.
*/
public final Instrumentation instrumentation() {
launchActivity();
return instrumentation;
}
@Override
public final Statement apply(final Statement base, Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
launchActivity();
base.evaluate();
if(!activity.isFinishing()) {
activity.finish();
}
activity = null; // Eager reference kill in case someone leaked our reference.
}
};
}
@SuppressWarnings("unchecked") // Guarded by generics at the constructor.
public void launchActivity() {
if(activity != null) {
return;
}
Instrumentation instrumentation = fetchInstrumentation();
String targetPackage = instrumentation.getTargetContext().getPackageName();
Intent intent = getLaunchIntent(targetPackage, activityClass);
activity = (T) instrumentation.startActivitySync(intent);
instrumentation.waitForIdleSync();
}
private Instrumentation fetchInstrumentation() {
Instrumentation result = instrumentation;
return result != null ? result
: (instrumentation = InstrumentationRegistry.getInstrumentation());
}
}